package main

import "fmt"

func main() {
	Print[string]("hello")
	Print[int](123)
	Print(123)
	Print(123.99)

	intContainer := Container[int]{value: 123}
	strContainer := Container[string]{value: "china"}
	fmt.Println(intContainer.Get())
	fmt.Println(strContainer.Get())

	// 这些调用合法
	Add(10, 20)   // int
	Add(1.5, 2.5) // float64

	// 这些调用不合法（编译错误）
	// Add("a", "b")    // string 不满足约束
	// Add(true, false) // bool 不满足约束

	var a MyInt = 10
	var b Score = 20
	var c Counter = 30

	fmt.Println(Double(a)) // 20
	fmt.Println(Double(b)) // 40
	fmt.Println(Double(c)) // 60
}

func Print[T any](value T) {
	fmt.Println(value)
}

type Container[T any] struct {
	value T
}

func (c *Container[T]) Set(value T) {
	c.value = value
}

func (c *Container[T]) Get() T {
	return c.value
}

// T 只能是数字类型
func Add[T int | float64](a, b T) T {
	return a + b
}

type Int interface { // // ~int 表示所有底层类型是 int 的类型
	~int | ~int8 | ~int16 | ~int32 | ~int64 // 近似元素（Approximation Element）
}

// 自定义类型
type MyInt int
type Score int
type Counter int

func Double[T Int](value T) T {
	return value * 2
}

// 判断在不在数组中
func CheckInArr[T int | string | uint | uint64](target T, strArray []T) bool {
	for _, element := range strArray {
		if target == element {
			return true
		}
	}
	fmt.Print()
	return false
}
